code unit
Unicode文字列をUTF-8やUTF-16等の符号化方式で表す時に使う、8ビット整数や16ビット整数のこと
https://qiita.com/mod_poppo/items/740659702f31216fdade#文字列とは
gpt-5.icon
1. 基本的な意味
code unit は、文字を符号化(encoding)するときに使う 最小の固定サイズのデータ単位 です。
つまり、code pointを格納するために、エンコーディング方式が選んだ最小の“箱”。
2. エンコーディングごとの code unit
Unicode の場合、代表的な符号化方式と code unit の関係はこうなります:
UTF-8
code unit = 8ビット(1バイト)
1〜4個の code unit を組み合わせて 1つの code point を表現する
例:
"A" (U+0041) → 41 (1 code unit)
"あ" (U+3042) → E3 81 82 (3 code units)
UTF-16
code unit = 16ビット(2バイト)
基本多言語面(BMP: U+0000〜U+FFFF)は1 code unit
補助平面(U+10000〜U+10FFFF)はサロゲートペアとして2 code units 必要
例:
"A" (U+0041) → 0041 (1 code unit)
😀 (U+1F600) → D83D DE00 (2 code units)
UTF-32
code unit = 32ビット(4バイト)
すべての code point を 1 code unit で表現可能
例: 😀 (U+1F600) → 0001F600 (1 code unit)
3. Code Point と Code Unit の関係
code point = 抽象的な番号(例: U+3042)
code unit = 実際に「その番号を符号化したときに使う最小単位」
例: "あ" (U+3042)
UTF-8 では → E3 81 82 (3 code units, 各1バイト)
UTF-16 では → 3042 (1 code unit, 2バイト)
UTF-32 では → 00003042 (1 code unit, 4バイト)
4. プログラミングにおける落とし穴
文字列の「長さ」を length で取ったときに、言語によって code point 単位なのか、code unit 単位なのか が違う。
JavaScript の string.length は UTF-16 の code unit 数
😀 (U+1F600) は 2 code units → length = 2
Python3 の len() は code point 数(内部実装依存だけど、論理的には1)
😀 → length = 1
つまり、「length が 1だから文字が1つ」とは限らないのが要注意ポイントです。